package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	_ "strings"
)

// 方式一：使用http.Get()方法发起请求
// func main() {
// 	resp, err := http.Get("http://localhost:8080/?name=zhangsan")
// 	if err!= nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	defer resp.Body.Close()
// 	body, err := ioutil.ReadAll(resp.Body)
// 	if err!= nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	fmt.Println(string(body))
// }

// 方式二：使用http.NewRequest()方法发起请求
// func main() {
// 	req, err := http.NewRequest("GET", "http://localhost:8080/?name=zhangsan", nil)
// 	if err!= nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	client := &http.Client{}
// 	resp, err := client.Do(req)
// 	if err!= nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	defer resp.Body.Close()
// 	body, err := ioutil.ReadAll(resp.Body)
// 	if err!= nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	fmt.Println(string(body))
// }

// 方式三：使用net/url库处理参数
// func main()  {
// 	// 1. 导入net/url库

// 	// 2. 创建url对象
// 	u, err := url.Parse("http://localhost:8080/?name=zhangsanlisi")
// 	if err != nil {
// 		fmt.Println(err)
// 		return
// 	}

// 	// 3. 创建请求对象
// 	req, err := http.NewRequest("GET", u.String(), nil)
// 	if err != nil {
// 		fmt.Println(err)
// 		return
// 	}

// 	// 4. 发送请求
// 	client := &http.Client{}
// 	resp, err := client.Do(req)
// 	if err != nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	defer resp.Body.Close()

// 	// 5. 读取响应内容
// 	body, err := ioutil.ReadAll(resp.Body)
// 	if err != nil {
// 		fmt.Println(err)
// 		return
// 	}
// 	fmt.Println(string(body))
// }

// 方式四：使用net/url库处理参数，并使用http.Get()方法发起请求
func main() {
	apiUrl := "http://127.0.0.1:8080"
	// URL param
	data := url.Values{}
	data.Set("name", "小王子")
	data.Set("age", "18")
	u, err := url.ParseRequestURI(apiUrl)
	if err != nil {
		fmt.Printf("parse url requestUrl failed, err:%v\n", err)
	}
	u.RawQuery = data.Encode() // URL encode
	fmt.Println(u.String())
	resp, err := http.Get(u.String())
	if err != nil {
		fmt.Printf("post failed, err:%v\n", err)
		return
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("get resp failed, err:%v\n", err)
		return
	}
	fmt.Println(string(b))
}

// 方式五：post请求
// func main() {
// 	url := "http://127.0.0.1:8080"
	
// 	contentType := "application/json"
// 	data := `{"name": "沙河小王子", "age": 18}`
// 	resp, err := http.Post(url, contentType, strings.NewReader(data))
// 	if err != nil {
// 		fmt.Printf("post failed, err:%v\n", err)
// 		return
// 	}
// 	defer resp.Body.Close()
// 	b, err := ioutil.ReadAll(resp.Body)
// 	if err != nil {
// 		fmt.Printf("get resp failed, err:%v\n", err)
// 		return
// 	}
// 	fmt.Println(string(b))
// }
